package com.dayuanit.dy15.lesson28.demo4;

public class BanZhuanRunnable implements Runnable {
    //volatile关键字 解决变量的可见性问题  面试重灾区。
    public volatile boolean flag = true;

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " run() begin");

        //停掉线程的推荐做法：定义一个布尔变量和中断信号同时判断，只要有一个不成立，则停止循环，结束run方法
        while (flag && !Thread.currentThread().isInterrupted()) {

            System.out.println(Thread.currentThread().getName() + " 中断信号=" + Thread.currentThread().isInterrupted());
            try {
                Thread.sleep(3 * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                //此时中断信号是false,为什么？因为：一旦抛出InterruptedException异常，则中断信号复位(也就是未中断 false)。
                System.out.println(Thread.currentThread().getName() + ">>>>>> 中断信号=" + Thread.currentThread().isInterrupted());
                //如果解决异常后中断信号复位的问题呢？很简单，再发一次中断信号
                Thread.currentThread().interrupt();//再发一次中断信号
                System.out.println(Thread.currentThread().getName() + ">>>>>> 中断信号=" + Thread.currentThread().isInterrupted());
            }

            System.out.println(Thread.currentThread().getName() + "搬砖...");
        }

        //善后的  把资源回收掉 比如IO流close

        System.out.println(Thread.currentThread().getName() + " 回收资源");
        System.out.println(Thread.currentThread().getName() + " run() end");
    }
}
